'use strict';
const semver = require('semver');
const colors = require('colors/safe');
const log = require('@liangshaojie/log');

const LOWEST_NODE_VERSION = '10.0.0'

class Command {
    // 构造方法
    constructor(argv) {
        console.log(argv);
        // 验证
        if (!argv) {
            throw new Error('参数不能为空！');
        }
        if (!Array.isArray(argv)) {
            throw new Error('参数必须为数组！');
        }
        if (argv.length < 1) {
            throw new Error('参数列表为空！');
        }
        // 参数保存在实例上，后面可能要用
        this._argv = argv;
        // 使用微任务去调用
        let chain = Promise.resolve();
        chain = chain.then(() => this.checkNodeVersion());
        chain = chain.then(() => this.initArgs());
        chain = chain.then(() => this.init());
        chain = chain.then(() => this.exec());
        chain.catch(err =>  {
            log.error('init error：', err.message);
        });
    }

    // 检查node版本号
    checkNodeVersion() {
        const currentVersion = process.version;
        const lowestVersion = LOWEST_NODE_VERSION;
        if (!semver.gte(currentVersion, lowestVersion)) {
            throw new Error(colors.red(`lsj-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`));
        }
    }

    // 初始化参数
    initArgs() {
        // 区分命令以及参数
        this._cmd = this._argv[this._argv.length - 1];
        this._argv = this._argv.slice(0, this._argv.length - 1);
    }

    // 必须实现init
    init() {
        throw new Error('init必须实现！');
    }

    // 必须实现exec方法
    exec() {
        throw new Error('exec必须实现！');
    }
}

module.exports = Command;